/**
 * 节流函数：在指定的时间间隔内只执行一次目标函数。
 * @param func - 需要节流执行的目标函数
 * @param limit - 设定的时间限制（毫秒），在此时间内不会重复执行目标函数
 * @returns 一个经过节流处理的函数
 */
export const throttle = <T extends (...args: any[]) => void>(func: T, limit: number): T => {
    // 标志位，用于指示当前是否处于节流状态
    let inThrottle: boolean

    /**
     * 返回一个包装后的节流函数。
     * @param this - 上下文（通常指向调用该函数的对象）
     * @param args - 传递给目标函数的参数
     */
    return function (this: any, ...args: Parameters<T>) {
        // 检查是否处于节流状态
        if (!inThrottle) {
            // 如果不处于节流状态，立即执行目标函数，并将当前上下文和参数传递给目标函数
            func.apply(this, args)

            // 将标志位设置为 true，进入节流状态
            inThrottle = true

            // 在设定的时间限制（limit）之后，重置标志位，允许再次执行目标函数
            setTimeout(() => {
                inThrottle = false
            }, limit)
        }
    } as T // 通过类型断言保证返回的函数类型与原始函数类型一致
}
